package com.yun.util.yun.utils.IP;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IpHelper {

    private final static Logger logger = LoggerFactory.getLogger(IpHelper.class);

    public static long ipToLong(String strIp){
        long[] ip = new long[4];
        //先找到IP地址字符串中.的位置
        int position1 = strIp.indexOf(".");
        int position2 = strIp.indexOf(".", position1 + 1);
        int position3 = strIp.indexOf(".", position2 + 1);
        //将每个.之间的字符串转换成整型
        ip[0] = Long.parseLong(strIp.substring(0, position1));
        ip[1] = Long.parseLong(strIp.substring(position1+1, position2));
        ip[2] = Long.parseLong(strIp.substring(position2+1, position3));
        ip[3] = Long.parseLong(strIp.substring(position3+1));
        return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
    }

    //将十进制整数形式转换成127.0.0.1形式的ip地址
    public static String longToIP(long longIp){
        StringBuffer sb = new StringBuffer("");
        //直接右移24位
        sb.append(String.valueOf((longIp >>> 24)));
        sb.append(".");
        //将高8位置0，然后右移16位
        sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16));
        sb.append(".");
        //将高16位置0，然后右移8位
        sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8));
        sb.append(".");
        //将高24位置0
        sb.append(String.valueOf((longIp & 0x000000FF)));
        return sb.toString();
    }


    public static boolean ipBetween(String startIpAddr,String endIpAddr,String ipAddr){
        Long start = null;
        Long end = null;
        Long current = null;
        if(StringUtils.isNotBlank(startIpAddr)){
            try{
                start = ipToLong(startIpAddr);
            }catch(Exception e){
                logger.error(startIpAddr,e);
            }
        }else{
            start = 0l;
        }
        if(StringUtils.isNotBlank(endIpAddr)){
            try{
                end = ipToLong(endIpAddr);
            }catch(Exception e){
                logger.error(startIpAddr,e);
            }
        }else{
            end = Long.MAX_VALUE;
        }
        try{
            current = ipToLong(ipAddr);
        }catch(Exception e){
            logger.error(startIpAddr,e);
        }
        if(current == null){
            return false;
        }
        if(end == null && start == null){
            return false;
        }

        if(end != null && start != null){
            return (current >= start && current<= end);
        }
        return (current == end || current == start);
    }

}
